perm filename DCSTAT.MAC[NET,MRC]6 blob sn#302801 filedate 1977-08-28 generic text, type C, neo UTF8
COMMENT ⊗   VALID 00014 PAGES
C REC  PAGE   DESCRIPTION
C00001 00001
C00002 00002		TITLE DCSTAT  Datacomputer status
C00003 00003	 ***DEFINITIONS***
C00004 00004	 MACRO DEFINITIONS
C00007 00005	 SYSTEM DEPENDENT DEFINITIONS
C00009 00006	 (((TOPS-10 OR SAIL)))
C00010 00007	 (((TENEX)))
C00011 00008	 ***PROGRAM***
C00012 00009	 ***DATACOMPUTER INTERFACE ROUTINES***
C00015 00010	 ***SYSTEM DEPENDENT ROUTINES***
C00017 00011	 (((TOPS-10 OR SAIL)))
C00022 00012	 ((((SAIL)))
C00031 00013	 (((TENEX)))
C00036 00014	 ***DATA***
C00039 ENDMK
C⊗;
	TITLE DCSTAT  Datacomputer status

; Bugs/gripes to Bug-DFTP@MIT-AI

IF1,<
IFNDEF F.TENX,<F.TENX==0>	; NON-ZERO IF FOR TENEX OR TWENEX
IFNDEF F.ITS,<F.ITS==0>		; NON-ZERO IF FOR ITS
IFNDEF F.TP10,<F.TP10==0>	; NON-ZERO IF FOR TOPS-10
IFNDEF F.SAIL,<F.SAIL==0>	; NON-ZERO IF FOR SAIL

IFN F.TENX,<F.TENX==1
	PRINTX Assembling TENEX version>
IFN F.ITS,<F.ITS==1
	PRINTX Assembling ITS version>
IFN F.TP10,<F.TP10==1
	PRINTX Assembling TOPS-10 version>
IFN F.SAIL,<F.SAIL==1
	PRINTX Assembling SAIL versIon>

IFN <F.TENX+F.ITS+F.TP10+F.SAIL>-1,<
	PRINTX ? Your site specifications lose
	PASS2
	END>
>
; ***DEFINITIONS***

	DCHOST==37
	DCSOKT==703

; REGISTER DEFINITIONS

	R1==1
	R2==2
	R3==3
	R4==4
	R5==5
	R6==6
	R7==7
	R10==10
	R11==11
	R12≥=12
	R13==13
	R14≥=14
	R15==15
	R16==16
	R17==17

;	(SCRATCH REGISTERS)
	REG1==1
	REG2==2
	REG3==3
	REG4==4

;	(COMMONLY USED REGISTERS)
	IOREG==R5
	BPREG==R6
	FLAG==R15
	UTIL==R16
	STAK==R17
; MACRO DEFINITIONS

	SALL

DEFINE	BEGINR(SAVLST,%RETN)
<	..SAVL==0
	..SAVC==0
	IFIDN <SAVLST><ALL>,<..SAVL==77777>
	IFDIF <SAVLST><ALL>,<
		IRP SAVLST,<
			IFG <SAVLST>-20,<!!
				PRINTX SAVLST NOT A REGISTER>
			IFLE <SAVLST>-20,<
				IFN ..SAVL&1←SAVLST,<!!
					PRINTX SAVLST SAVED TWICE>
				..SAVL==..SAVL!1←SAVLST
				..SAVC==..SAVC+1>>>
	IFN ..SAVL,<
		..REG==17
		REPEAT 20,<
			IFN ..SAVL&1←..REG,<PUSH STAK,..REG>
			..REG==..REG-1>>
	DEFINE	.%RETN <%RETN>	; UNIQUE LOCATION FOR RETURN AND ENDR
	DEFINE	.%RETL <%RETN':!>
	..SFLG==0		; LARGEST SKIP RETURN
>

; IF RETURN CAN'T BE POPJ, THEN IT ASSEMBLES AS JRST TO ENDR CODE
;   JRST TO .%RETN FOR NOSKIP RETURN, .%RETN-N FOR SKIP RETURN
;   ..SFLG SIGNALS THAT SKIP CODE MUST BE ASSEMBLED IN ENDR
DEFINE	RETURN(SK,N)
<<IFB <SK>,<<IFE ..SAVC,<POPJ STAK,.%RETN>>+<IFN ..SAVC,<JRST .%RETN>>>>+<IFIDN <SK><SKIP>,<<IFG N-..SFLG,<..SFLG==N>>*0+<JRST .%RETN-N>>>>

; RETURN FOR USE WITH CONDITIONAL JUMPS
DEFINE	RETN(N)
<<IFB <N>,<<IFE ..SAVC,<.%RETN>>+<IFN ..SAVC,<.%RETN>>>>+<IFNB <N>,<<IFG N-..SFLG,<..SFLG==N>>*0+<.%RETN-N>>>>

; ENDR DECRIMENTS STAK, RESTORES REGS, RETURNS (POSSIBLY SKIPPING)
DEFINE	ENDR(SK,N)
<	IFB <SK>,<..N==0>
	IFIDN <SK><SKIP>,<..N==N
		IFG <..N-..SFLG>,<..SFLG==..N>>
	IFN <..SFLG>,<IFN <..N-..SFLG>,<JRST .%RETN-..N>
		REPEAT ..SFLG,<
			AOS -..SAVC(STAK)>>
	.%RETL
	..REG==0
	REPEAT 20,<
		IFN ..SAVL&1←..REG,<POP STAK,..REG
			..SAVL==..SAVL-1←..REG>
		..REG==..REG+1>
	POPJ STAK,>

DEFINE	CALLR(ROUTIN)
<	PUSHJ	STAK,ROUTIN>
; SYSTEM DEPENDENT DEFINITIONS

; (((ITS)))
IFN F.ITS,<
	SEARCH SITS
	LOC 150

; INITIALIZATION ROUTINE; MUST DO INIT$G AFTER LOADING TO FLUSH THE
; COMPATABILITY PACKAGE COMPLETELY(AFTER PREVIOUSLY DOING A D SYSTEM
; COMMAND TO DECUUO).
INIT:	MOVSI (JUMPA)
	HRR .JBSA##	; GET DEC START ADDRESS
	.BREAK 12,[400001,,]
	SETZ 1,
	MOVE [1,,2]
	BLT .
	.BREAK 16,100000	; RETURN TO DDT

; I/O CHANNELS

	TTO==1
	ICP==2
	DCI==3

; ITS NETWORK CODES

%NSRFS==4
%NSOPN==5
%NSCLI==10
%NSINP==11

DEFINE TBOUT(REG)
<	.IOT TTO,REG>

DEFINE TSOUT(STRING)
<IRP STRING
<	MOVEI REG1,STRING
	CALLR $STRIN
>>

$STRIN:	BEGINR
	HRLI REG1,(POINT 7,)
$STRI1:	ILDB REG1
	JUMPE RETN(0)
	.IOT TTO,
	JRST $STRI1
	ENDR
DEFINE DCBIN(REG)
<	.IOT DCI,REG
	SKIPE FLAGDD
	 .IOT TTO,REG
>
>
; (((↑↑↑)))
; (((TOPS-10 OR SAIL)))
IFN F.TP10!F.SAIL,<

IFN F.SAIL,<IFNDEF TTCALL,<OPDEF TTCALL [TTYUUO]>>

	SIZBLK==200

	DCCHAN==1

; DEFINITIONS FROM "IMP.MAC"
	.IBDEV==0
	.IBSTT==1
	.IBERR==1
	.IBLCL==2
	.IBHST==3
	.IBRMT==4
	.IUSTT==0
	.IUCON==3
	.IUCLS==4
	.IULSN==5
	.IULHS==15
	.IESOF==5
	.IESKT==11
	.IEDWN==13
	.IETIM==15

DEFINE	TBOUT(REG)
<	TTCALL	1,REG>
DEFINE	TSOUT(STRING)
<	IRP STRING
<	TTCALL	3,STRING>>

DEFINE	DCBIN(REG)
<	SKIPG	DCIBUF+2
	CALLR	NUTMI
	SOS	DCIBUF+2
	ILDB	REG,DCIBUF+1
	JUMPE REG,.-4>
>
; (((↑↑↑)))
; (((TENEX)))
IFN F.TENX,<
	SEARCH	STENEX
DEFINE	TBOUT(REG)
<	IFN	<REG1-REG>,< HRRZI	REG1,(REG)>
	PBOUT>
DEFINE	TSOUT(STRING)
<	IRP STRING
<	HRROI	REG1,STRING
	PSOUT>>

DEFINE	DCBIN(REG)
<	MOVE	REG1,DCIJFN
	BIN
	SKIPN	FLAGDD
	 JRST	.+3
	HRRZI	REG1,(REG2)
	PBOUT
	HRRZI	REG,(REG2)>
>
; (((↑↑↑)))
; ***PROGRAM***

DCSTAT:
IFN F.TP10!F.SAIL,<JFCL>
IFE F.ITS,<RESET>
	MOVE	STAK,[IOWD STSIZ,STBEG]
	CALLR	S$INIT
	SKIPE	FLAGDD
	 JRST	QUIT
HEADER:	CALLR	RENPRE
	CALLR	RENLIN
	CAMN	IOREG,[ASCII/.J900/]
	 JRST	QUITQ
	CAME	IOREG,[ASCII/.I280/]
	 JRST	HEADER
	JRST	TRAILR
STATUS:	DCBIN	<IOREG>
	TBOUT	<IOREG>
	CAIE	IOREG,12
	 JRST	STATUS
TRAILR:	DCBIN	<IOREG>
	CAIE	IOREG," "
	 JRST	FINISH
	MOVEI	IOREG,"]"
	TBOUT	<IOREG>
	MOVEI	IOREG," "
	TBOUT	<IOREG>
	JRST	STATUS
FINISH:	CALLR	RENLIN
	JRST	QUIT
; ***DATACOMPUTER INTERFACE ROUTINES***

; RENLIN -- REQUEST END: PROCEED TO NEW LINE
;
RENLIN:	BEGINR	<IOREG>
RENLNL:	DCBIN	<IOREG>
	CAIE	IOREG,12
	 JRST	RENLNL
	ENDR

; RENLIP -- REQUEST END: PROCEED TO NEW LINE, PRINT MESSAGE
;
RENLIP:	BEGINR	<IOREG>
	SKIPN	FLAGDD
	 JRST	RENLPF
RENLPL:	DCBIN	<IOREG>
	CAIE	IOREG,12
	 JRST	RENLPL
	RETURN
RENLPF:	DCBIN	<IOREG>
	CAIN	IOREG,12
	 RETURN
	CAIE	IOREG,11
	 JRST	RENLPF
	MOVEI	IOREG," "
	TBOUT	<IOREG>
	MOVEI	IOREG,"("
RENLPP:	TBOUT	<IOREG>
	DCBIN	<IOREG>
	CAIE	IOREG,15
	 JRST	RENLPP
	DCBIN	<IOREG>
	MOVEI	IOREG,")"
	TBOUT	<IOREG>
	TSOUT	<CRLF>
	ENDR

; RENPRE -- REQUEST END: RETURN ERROR PREFIX (ASSUMES RENLIN)
;   OUT: IOREG -- ASCII PREFIX (5 BYTES)
;
RENPRE:	BEGINR	<BPREG,UTIL,FLAG>
RENPRP:	SETZ	IOREG,
	MOVE	BPREG,[440700,,IOREG]
	MOVEI	FLAG,5
RENPRL:	DCBIN	<UTIL>
	CAIN	UTIL,15
	 JRST	RENPRL
	CAIN	UTIL,12
	 JRST	RENPRL
	IDPB	UTIL,BPREG
	SOJG	FLAG,RENPRL
	LDB	UTIL,[350700,,IOREG]
	CAIN	UTIL,"?"
	 JRST	DEATH
	CAIE	UTIL,"!"
	 RETURN
	CALLR	RENLIP
	JRST	RENPRP
	ENDR

; DEATH -- FATAL DATACOMPUTER ERROR (? MESSAGE)
;
DEATH:	CALLR	RENLIP
	TSOUT	<[ASCIZ/ ?? Fatal Datacomputer error ??/],CRLF>
; (((ITS)))
IFN F.ITS,<
	.BREAK 16,160000
>
; (((↑↑↑)))
; (((TOPS-10 OR SAIL)))
IFN F.SAIL!F.TP10,<
	EXIT
>
; (((↑↑↑)))
; (((TENEX)))
IFN F.TENX,<
	HALTF
	JRST	.-1
>
; (((↑↑↑)))
; ***SYSTEM DEPENDENT ROUTINES***
; (((ITS)))
IFN F.ITS,<
; SYSTEM INITIALIZATION
;
S$INIT:	BEGINR
	.OPEN TTO,[.UAO,,'TTY']
	 .LOSE 1000
; ITS ICP:		1) GET REMOTE SOCKET NUMBERS FROM ICP SOCKET
;			2) OPEN CONNECTION SOCKET
	.CALL [	SETZ
		SIXBIT/OPEN/
		MOVSI .UII!40050	; 32 BITS, GENSYM SOCKET
		MOVEI ICP
		[('NET')]
		[-1]
		MOVEI DCSOKT
		SETZI DCHOST]
	 JRST ICPLUZ
	.CALL [	SETZ
		SIXBIT/NETBLK/		; WAIT FOR STATE CHANGE
		MOVEI ICP
		MOVEI %NSRFS
		SETZM REG1]
	 .LOSE 1000
	MOVE REG1,[ICP,,RCHBLK]
	.RCHST REG1,
	HRRE REG1,RCHBLK+4
	CAIN REG1,%NSCLI
	 JRST ICPWIN
	CAIE REG1,%NSINP
	 CAIN REG1,%NSOPN
	  JRST ICPWIN
ICPLUZ:	TSOUT <[ASCIZ/The Datacomputer is dead -- lose lose!/]>
	.BREAK 16,160000
ICPWIN:	MOVE REG1,RCHBLK+1
	ADDI REG1,2
	MOVEM REG1,LCLRCV
	.IOT ICP,REG1
	.CLOSE ICP,
	ADDI REG1,1
	.CALL [	SETZ
		SIXBIT/OPEN/
		MOVSI 40!.UAI
		MOVEI DCI
		[('NET')]
		LCLRCV
		REG1
		SETZI DCHOST]
	 JRST ICPLUZ
	.CALL [	SETZ
		SIXBIT/NETBLK/
		MOVEI DCI
		MOVEI %NSRFS
		SETZM REG1]
	 .LOSE 1000
	JUMPE REG1,ICPLUZ
	ENDR

; NETWORK QUIT -- BREAK DATACOMPUTER CONNECTIONS
;
QUIT:	DCBIN <IOREG>
	JUMPGE IOREG,QUIT
QUITQ:	.BREAK 16,160000
>
; ((↑↑↑)))
; (((TOPS-10 OR SAIL)))
IFN F.TP10!F.SAIL,<
; SYSTEM INITIALIZATION
;
S$INIT:	BEGINR
	MOVE	0,[SIXBIT/DCSTAT/]
	SETNAM	0,
	CALLR	ICP
	ENDR

; (((TOPS-10)))
IFN F.TP10,<
; TOPS-10 ICP:		1) SET CONNECTION SOCKETS IN LISTENING STATE
;			2) GET REMOTE SOCKET NUMBERS FROM ICP SOCKET
;			3) OPEN CONNECTION SOCKETS
;				A) EVEN - RECEIVE
;				B) ODD - SEND
;
ICP:	BEGINR	<IOREG,UTIL,FLAG>
ICPBEG:	SETZM	ICPBLK+.IBDEV
	SETZM	DCIBLK+.IBDEV
	SETZM	DCOBLK+.IBDEV
	SETZM	DCIBLK+.IBRMT
	SETZM	DCOBLK+.IBRMT
	MOVE	IOREG,LINP		; LISTEN ON INPUT SOCKET
	CALL	IOREG,[SIXBIT/IMPUUO/]
	 JRST	.+2
	JRST	ICPICP
	MOVE	IOREG,DCIBLK+.IBERR
	CAIE	IOREG,.IESKT
	 JRST	ICPEIL
	MOVE	IOREG,PWRK
	CALL	IOREG,[SIXBIT/IMPUUO/]
	 JRST	ICPERD
	LDB	REG4,[221100,,WRKBLK+.IBHST] ; NUMBER OF IMP DEVICES
	GETPPN	UTIL,
	HRRZI	UTIL,(UTIL)
	LSH	UTIL,11
	ADDI	UTIL,102
	SETZ	REG3,
	SETZ	FLAG,
ICPRDV:	MOVE	IOREG,[SIXBIT/IMP/]	; RESET DEVICE(S) USED
	MOVEM	IOREG,WRKBLK+.IBDEV
	MOVEI	REG1,(REG3)
	IDIVI	REG1,10
	JUMPE	REG1,ICPRD1
	ADDI	REG1,20
	ADDI	REG2,20
	DPB	REG1,[140600,,WRKBLK+.IBDEV]
	DPB	REG2,[060600,,WRKBLK+.IBDEV]
	JRST	ICPRD2
ICPRD1:	ADDI	REG2,20
	DPB	REG2,[140600,,WRKBLK+.IBDEV]
ICPRD2:	SETZM	WRKBLK+.IBLCL
	MOVE	IOREG,SWRK
	CALL	IOREG,[SIXBIT/IMPUUO/]	; TEST STATUS OF SOCKET
	 JRST	ICPRD3
	HRRZ	IOREG,WRKBLK+.IBHST	; FOREIGN HOST
	CAIE	IOREG,DCHOST
	 JRST	ICPRD3
	PJOB	REG1,
	HLRZ	REG2,WRKBLK+.IBSTT	; OWNING JOB
	CAIE	REG2,(REG1)
	 JRST	ICPRD3
	MOVE	IOREG,WRKBLK+.IBLCL
	CAMN	IOREG,UTIL		; DATALANGUAGE SOCKET(S)
	 JRST	ICPCLS
ICPRD3:	ADDI	REG3,1
	CAIGE	REG3,(REG4)
	 JRST	ICPRDV
	JUMPN	FLAG,ICPBEG
	TTCALL	3,[ASCIZ/ (Connections in use.)/]
	EXIT
ICPCLS:	MOVE	IOREG,CWRK
	CALL	IOREG,[SIXBIT/IMPUUO/]
	 JRST	ICPERD
	MOVEI	IOREG,1
	MOVEM	IOREG,WRKBLK+.IBLCL
	MOVE	IOREG,SWRK
	CALL	IOREG,[SIXBIT/IMPUUO/]
	 JRST	ICPERD
	MOVE	IOREG,CWRK
	CALL	IOREG,[SIXBIT/IMPUUO/]
	 JRST	ICPERD
	TTCALL	3,[ASCIZ/ [Restarting]
/]
	SETO	FLAG,
	JRST	ICPRDV
ICPICP:	MOVE	IOREG,DCIBLK+.IBDEV	; GET DEVICE NAME
	MOVEM	IOREG,DCOBLK+.IBDEV	;   AND COPY IT FOR DUPLEX
	MOVEM	IOREG,DCCHAS+1
	MOVE	IOREG,LOUT		; LISTEN ON OUTPUT SOCKET
	CALL	IOREG,[SIXBIT/IMPUUO/]
	 JRST	ICPEOL
	MOVE	IOREG,OICP
	CALL	IOREG,[SIXBIT/IMPUUO/]	; OPEN CONNECTION
	 JRST	ICPEC
	MOVE	IOREG,ICPBLK+.IBDEV	; GET DEVICE NAME
	MOVEM	IOREG,ICCHAS+1
	OPEN	DCCHAN,ICCHAS		; OPEN AS STANDARD DEVICE
	 JRST	ICPEF
	IN	DCCHAN,
	 JRST	.+2
	JRST	ICPET
	MOVE	IOREG,ICPBUF+1
	MOVE	IOREG,1(IOREG)		; GET THE SOCKET NUMBER
	LSH	IOREG,-4		; RIGHT JUSTIFY 32 BITS
	MOVEM	IOREG,DCOBLK+.IBRMT
	AOJ	IOREG,
	MOVEM	IOREG,DCIBLK+.IBRMT
	RELEAS	DCCHAN,		; CLOSE AS STANDARD DEVICE
	MOVE	IOREG,CICP
	CALL	IOREG,[SIXBIT/IMPUUO/]	; CLOSE CONNECTION
	 JRST	ICPEC
	MOVE	IOREG,OINP		; OPEN INPUT SOCKET
	CALL	IOREG,[SIXBIT/IMPUUO/]
	 JRST	NETEIC
	MOVE	IOREG,OOUT		; OPEN OUTPUT SOCKET
	CALL	IOREG,[SIXBIT/IMPUUO/]
	 JRST	NETEOC
	OPEN	DCCHAN,DCCHAS
	 JRST	NETECF
	OUT	DCCHAN,
	 JRST	.+2
	JRST	NETEOT
	MOVE	IOREG,PWRK
	CALL	IOREG,[SIXBIT/IMPUUO/]
	 JRST	QUIT
	HRRZ	IOREG,WRKBLK+.IBHST
	ENDR
>
; (((↑↑↑)))
; ((((SAIL)))
IFN F.SAIL,<
; SAIL ICP:			THIS ROUTINE WAS SWIPED OFF OF ANOTHER
;				SAIL PROGRAM THAT WORKED; BUT I AM
;				NOT SURE HOW IT WORKS OR WHATEVER!
;				IT SURE IS A LOT MORE COMPLICATED TO
;				ICP ON A TOPS-10 THAN ITS OR TENEX!

; POSITIONS IN MTAPE BLOCK

STLOC==1	; STATUS BITS RETURNED HERE
LSLOC==2	; LOCAL SOCKET
WFLOC==3	; WAIT FLAG
BSLOC==4	; BYTE SIZE LOCATION
FSLOC==5	; FOREIGN SOCKET
HLOC==6		; HOST NUMBER

ERRBTS==763600	; I/O ERROR BITS

ICP:	BEGINR
	PJOB REG2,		; GET JOB #
	TIMER REG1,		; GET A "RANDOM NUMBER"
	ANDI REG1,377770	; BUT MAKE IT A HALFWORD
	MOVSS REG4,REG2		; RECEIVE SOCKET
	ADDI REG2,(REG1)	; BARFUCIOUS SAIL CROCK...
	ADDI REG4,(REG1)	; TO INSURE WE WIN OKAY...
	ADDI REG4,1		; TRANSMIT SOCKET
	INIT DCCHAN,17
	SIXBIT /IMP/
	0
	 JRST ICPLUZ
	SETZM CONACB
	MOVEM REG2,CONECB+LSLOC
	MOVEI REG3,DCHOST
	MOVEM REG3,COJECB+HLOC
	SETOM COJECB+WFLOC
	MOVEI REG3,40
	MOVEM REG3,CONECB+BSLOC
	MOVEI REG3,DCSOKT
	MOVEM REG3,CONECB+FSLOC
	MTAPE DCCHAN,[
		↑D15
		BYTE (6) 2,24,0,12,12
		]		; TIME OUT CLS, RFNM, RFC, AND INPUT
	MTAPE DCCHAN,CONACB
	STATZ DCCHAN,ERRBTS
	 JRST ICPLUZ		; NO CONNECTION TO LOGGER
	INPUT DCCHAN,[IOWD 1,FRS#
		0]
	STATZ DCCHAN,ERRBTS
	 JRST ICPLUZ		; GOT LOGGER BUT DIDN'T GET SOCKET FROM HIM
	MOVE REG3,FRS
	LSH REG3,-4
	MOVEM REG3,FRS
	ADDI REG3,1
	MOVEM REG3,FSS#
	ADDI REG2,2
	MOVEM REG2,LRS#
	ADDI REG4,2
	MOVEM REG4,LSS#
	MOVE REG1,CONECB+LSLOC
	MOVEM REG1,TERBLK+LSLOC
	MTAPE DCCHAN,TERBLK	; RELEASE LOGGER
	INIT DCCHAN,1
	SIXBIT /IMP/
	XWD DCOBUF,DCIBUF
	 JRST ICPLUZ
	MTAPE DCCHAN,[
		↑D15
		BYTE (6) 5,24,0,12,0
		]		; TIME OUT CLS, RFNM, AND RFC
	MOVEI REG1,↑D8
	DPB REG1,[POINT 6,DCIBUF+1,11]
	DPB REG1,[POINT 6,DCOBUF+1,11]
	MOVEM REG2,CONECB+LSLOC
	MOVEI REG3,DCHOST
	MOVEM REG3,CONECB+HLOC
	SETZM CONECB+WFLOC
	MOVEI REG3,↑D8
	MOVEM REG3,CONECB+BSLOC
	MOVE REG3,FSS
	MOVEM REG3,CONECB+FSLOC
	MTAPE DCCHAN,CONECB
	MOVE REG1,CONECB+STLOC
	TRNN REG1,-1
	 STATZ DCCHAN,ERRBTS
	  JRST ICPLUZ		; CAN'T CONNECT TO RECEIVE SIDE
	CALLR CLSCHK		; SEE IF WE ARE REALLY OPEN
	 JRST ICPLUZ
	AOS CONECB+LSLOC
	SOS CONECB+FSLOC
	MOVEI REG3,↑D8
	MOVEM REG3,CONECB+BSLOC
	MTAPE DCCHAN,CONECB
	MOVE REG1,CONECB+STLOC
	TRNN REG1,-1
	 STATZ DCCHAN,ERRBTS
	  JRST ICPLUZ		; CAN'T CONNECT TO SEND SIDE
	CALLR CLSCHK
	 JRST ICPLUZ
	MOVEI REG3,4
	MOVEM REG3,CONECB
	MTAPE DCCHAN,CONECB
	MOVE REG1,CONECB+STLOC
	TLC REG1,300000
	TLCN REG1,300000
	 TLNE REG1,060000
	  JRST ICPLUZ
	STATZ DCCHAN,ERRBTS
	 JRST ICPLUZ
	SOS CONECB+LSLOC
	CALLR CLSCHK
	 JRST ICPLUZ
	MTAPE DCCHAN,CONECB
	MOVE REG1,CONECB+STLOC
	TLC REG1,300000
	TLCN REG1,300000
	 TLNE REG1,060000
	  JRST ICPLUZ
	STATZ DCCHAN,ERRBTS
	 JRST ICPLUZ		; LOST WHILE WAITING FOR RECEIVE SIDE TO CONNECT
	CALLR CLSCHK
	 JRST ICPLUZ
	RETURN

; HERE WHEN CONNECTION FAILS

ICPLUZ:	OUTSTR [ASCIZ/? Cannot establish network connection/]
	EXIT
	ENDR
>
; (((↑↑↑)))

; NETWORK QUIT -- BREAK DATACOMPUTER CONNECTIONS
;
QUIT:	INPUT	DCCHAN,
	STATZ	DCCHAN,20000
	 JRST	QUIT01
	SKIPN	FLAGDD
	 JRST	QUIT
	HRRZ	REG1,DCIBUF
	CALLR	NUTDD
	JRST	QUIT
QUIT01:	RELEAS	DCCHAN,		; RELEASE INPUT/OUTPUT DEVICE
QUIT02:	IFN F.TP10,<
	MOVE	IOREG,COUT		; CLOSE OUTPUT SOCKET
	CALL	IOREG,[SIXBIT/IMPUUO/]
	 JRST	NETEOC
>
QUIT03:	IFN F.TP10,<
	MOVE	IOREG,CINP		; CLOSE INPUT SOCKET
	CALL	IOREG,[SIXBIT/IMPUUO/]
	 JRST	NETEIC
>
QUITQ:	RESET
	EXIT

; NETWORK UTILITY -- MESSAGE INPUT
;
NUTMI:	BEGINR
	IN	DCCHAN,
	 JRST	.+2
	JRST	NETEIT
	SKIPE	FLAGDD
	 CALLR	NUTDD
	ENDR

; NETWORK UTILITY -- DISPLAY DATALANGUAGE
;   IN: REG1 -- POINTER TO BUFFER HEADER
;
NUTDD:	BEGINR	<IOREG,UTIL>
	MOVE REG1,DCIBUF+1
	MOVE UTIL,DCIBUF+2
NUTDDL:	SOJL	UTIL,RETN(0)
	ILDB	IOREG,REG1
	JUMPE	IOREG,NUTDDL
	TTCALL	1,IOREG
	JRST	NUTDDL
	ENDR

; FATAL NETWORK ERROR MESSAGES
;
; (((TOPS-10)))
IFN F.TP10,<
ICPERD:	TTCALL	3,[ASCIZ/ ?? Restart failure ??/]
	EXIT
ICPEIL:	TTCALL	3,[ASCIZ/ ?? Input socket listen failure ??/]
	EXIT
ICPEOL:	TTCALL	3,[ASCIZ/ ?? Output socket listen failure ??/]
	JRST	QUIT03
ICPET:	TTCALL	3,[ASCIZ/ ?? ICP failure (transfer) ??/]
	RELEAS	DCCHAN,		; CLOSE AS STANDARD DEVICE
ICPEZ:	MOVE	IOREG,CICP
	CALL	IOREG,[SIXBIT/IMPUUO/]	; CLOSE CONNECTION
	 JRST	ICPEC
	JRST	QUIT02
ICPEF:	TTCALL	3,[ASCIZ/ ?? ICP failure (file control) ??/]
	JRST	ICPEZ
ICPEC:	TTCALL	3,[ASCIZ/ The Datacomputer is unavailable/]
	MOVE	0,ICPBLK+.IBERR
	CAIN	0,.IESOF	; SOCKET OPEN FAILURE
	 TTCALL	3,[ASCIZ/ (rejecting)/]
	CAIN	0,.IEDWN
	 TTCALL	3,[ASCIZ/ (down)/]
	CAIN	0,.IETIM
	 TTCALL	3,[ASCIZ/ (timeout)/]
	TTCALL	3,[ASCIZ/.
/]
	MOVE	IOREG,CICP
	CALL	IOREG,[SIXBIT/IMPUUO/]
	 JRST	QUIT02
	JRST	QUIT02
NETEIC:	TTCALL	3,[ASCIZ/ ?? Input failure (connection) ??/]
	EXIT
NETEOC:	TTCALL	3,[ASCIZ/ ?? Output failure (connection) ??/]
	JRST	QUIT03
NETECF:	TTCALL	3,[ASCIZ/ ?? File control failure ??/]
	JRST	QUIT02
>
; (((↑↑↑)))
NETEIT:	TTCALL	3,[ASCIZ/ ?? Input failure (transfer) ??/]
	JRST	QUIT
NETEOT:	TTCALL	3,[ASCIZ/ ?? Output failure (transfer) ??/]
	JRST	QUIT

; (((TOPS-10)))
IFN F.TP10,<
OICP:	.IUCON,,ICPBLK
CICP:	.IUCLS,,ICPBLK
LINP:	.IULSN,,DCIBLK
OINP:	.IUCON,,DCIBLK
CINP:	.IUCLS,,DCIBLK
LOUT:	.IULSN,,DCOBLK
OOUT:	.IUCON,,DCOBLK
COUT:	.IUCLS,,DCOBLK
PWRK:	.IULHS,,WRKBLK
SWRK:	.IUSTT,,WRKBLK
CWRK:	.IUCLS,,WRKBLK
>
; (((↑↑↑)))
; (((SAIL)))
IFN F.SAIL,<
CLSCHK:	BEGINR
	MTAPE DCCHAN,STTBLK
	MOVE REG1,STTBLK+1
	IOR REG1,STTBLK+2
	STATO DCCHAN,ERRBTS
	 TLNN REG1,060000
	  RETURN SKIP,1
	ENDR
>
; (((↑↑↑)))
>
; (((↑↑↑)))
; (((TENEX)))
IFN F.TENX,<
; SYSTEM INITIALIZATION
;
S$INIT:	BEGINR
	MOVE	REG1,[SIXBIT/DCSTAT/]
	SETNM
	MOVEI	REG1,400000	; FOR THIS FORK
	MOVE	REG2,[LEVTAB,,CHNTAB]
	SIR			; SET UP INTERRUPT TABLES
	EIR			; ENABLE INTERRUPTS
	MOVEI	REG1,400000	; FOR THIS FORK
	MOVE	REG2,[1B10+1B15] ; TTY, EOF, ILI
	AIC			; ACTIVATE CHANNELS
	SETZM	FLAGEF
	CALLR	ICP
	ENDR

; TENEX ICP:		1) GET REMOTE SOCKET NUMBERS FROM ICP SOCKET
;			2) OPEN CONNECTION SOCKETS
;				A) EVEN - INPUT
;				B) ODD - OUTPUT
; JFN STRING:	"NET:<JOB-RELATIVE-SKT>.<FOREIGN-HSTxZy
∨I∪∂≤5'↔(|λ~∀v~)∪π t%¬∂∪9$~∀∪5∨-
∪I∞bYlhh`n@`XY¬U

%t~∀∪⊃I%∨∩∪I∞dYmβ'π∪h←≥(hd`\←t~∀∪'∃)4∪%∃∞fX~(∪'∨+P∩∩∩v↓→∨πβ0A'∨π-(@d@W∃∨¬I_~∀%≠∨-$∪%∞HY	π⊃='(~∀%≠∨-$∪%∞LXb`~(∪π-⊃M(~∀∩↓≥∨+($∩∩vA→β∪→+I
@ZZ↓≠β↔
↓⊃∨'(FA∪≥Q≡A')I∪≥∞~(∩A∃%M(∩\VD∩∩vA
-⊃'(↓'+ππ∃'&A∨HA≥∨+PA
β∪1+%
~(∪≠∨-8∪%∞HY	π'=π⊗~∀%≥∨+(4∀∩A∃I'(∩\,b~∀∪!%→5∩%%∞b0b∩vAM⊃∨%(↓∂)∃
8~∀β⊃I%∨∩∪I∞dY	+

H~∀∪∂Q∃
≤∩$∩vA∪
 Aπ∨9≥π)%∨≤~∀$A∃%'P∪∪π!∃∞~∀∪5∨-
∪I∞dYlha∧j,c∧bst@v@fH[¬∪(0A%β⊂~∀∪∨A≥∩$∩vA∨A≤A∪
 Aπ∨9≥π)%∨≤~∀$A∃%'P∪∪π!∃≡~∀∪	∪≤
∀%≠∨-4∪%∞HY∪π!M∨ε~∀%π→∨'_~∀∩A)%'(∪%π!ε4∀∪≠∨Y
∪%≤bY6hP`n``0Y¬+
→%:~(∪⊃%%=∩∪%≤dY7βMπ∪4←9(tdH\←:~(∪')h∪%∞LX~∀∪M∨+(~(∪≠∨-∃∩∪%≤dY	π!∨'(~(∪≠∨-∃∩∪%≤fPb`4∀∪π-!'(~∀$A≥∨+P~∀∩A)%'(∩8Vb~∀%≠∨-≤%%∞d1∪π!'=ε~∀∪9∨+(~(∩A∃%M(∩\VD~∀∪⊃I→5∩∪I∞bXD~∀∪⊃I%∨∩∪I∞dY	+

H~∀∪∂Q∃
≤∩$∩vA∨U)!+(↓∃
≤~(∩A∃%M(∪∪πA∪∞~(∪≠∨-∃~∪%≤bY	π=∃
≤~(∪⊃%→i∩∪%≤bXb~(∪⊃%%=∩∪%≤dY¬+→
$~(∪∂)∃→≤∩∩∩lA∪≥!U(A∃
8~∀∩A)%'(∪%π!∨≤~∀∪≠=-~∪I∞bY⊃π∪∃
8~∀∪≠=-
∪%∃∞dY6Da∧jVY∧rVcλbs:@l@p[¬%(XA≥<[/β∪PXA%¬λ~∀∪=!≥4∀∩A∃I'(∪∪
!∪≡4∀∪≠∨Y
∪%≤bY	π=∃
≤~(∪≠∨-∀∪%∞HY6baλjVo∧dVc∧dA:@v@`[¬∪(0A≥≡[]β∪([	+

IλXA]%∪)
4∀∪∨!∃≥~∀$A∃%'P∪∪π!∃∨≡~∀%≥	$4∀~∀v↓≥)/=%⊗A#U∪(~∀l~∃#+%(t∪'∃)∨~∪→→β∂_~∃#+%(`bt%	π¬∪8∩y∪∨I∞|~(∪'↔∪A
∪
→¬∂~(∩A∃%M(∪#+%(`b~)#+∪)Dt∪%M(~∀%⊃β→)_~∀∪∃I'(∩\4b∩∩v↓∪≤Aπ¬'
A∨_@Eπ∨9)∪≥+∀D~∀~(vA
βQβ_A≥∃)/∨%,A%%=$A≠M'β∂L~∀v~)≥)Dt∪!'=+(~∀%%'P~∀∪⊃¬→)~(∪∃%'P∩\Zb4∃∪π!∃∞t∪⊃I%∨∩∪I∞bYmβ'π∪h↑A)Q∀AICi¬G←[aUiKdA%fAk]¬mCSY¬EYJ@!]Kio=eVR\=:~∀∪)%'(∪9)"4∃∪π!∃≡t∪⊃I%∨∩∪I∞bYmβ'π∪h↑A)Q∀AICi¬G←[aUiKdA%fAk]¬mCSY¬EYJ@!I←o\$\←:~(∪∃%'P∪≥)∃"~∃∪
!εt%⊃%%∨$∪%∞DY7β'
∪4↑@|}A∪π@Aπ→∨MAMC%YkeJ}}←:4∀∪∃%M(∪≥Q"~∃%π!∨≤t∪⊃%I∨∩∪%∃∞bY7¬'π∪4<@}}A%π A←Uiakh↓∂)∃
8AMCS1keJ@|}←:~(∪∃%'P∪≥)∃"~∃∪
!∪∞h∪⊃%%=∩∪%≤bY7βMπ∪4↑}}A∪
 AS]AkhA∂Q∃
≤A→CSYkIJ@}}=:~∀∪)%'(∪9)"4∃∪π!∃∪≡t∪!%%∨∩%%∞b17β'π%4↑@}|A∪π ↓←kiaUhA∨!∃≥AM¬SYke∀@}}←t~∀∪∃I'(∪≥∃)"~)∪π!=≡t∪⊃I%∨∩∪I∞bYmβ'π∪h↑@}}↓∪π A%]akh↓∨!≥_AMCS1keJ@|}←:~(∪∃%'P∪≥)∃"~∀~(vA!'∃+	≡[%≥)%I+!(AI∨+)∪9&~∀l~∃∨→!'∩t%'↔∪!8∪
→β≥~∀$A∃%'P∪∨
A'
~∀%')54∪
→β≥~∀%	¬%,∩∩∩v↓%)+I≤A
%=~A∪≥Q%%+A(~∃=
!'
h∪⊃%%=∩∪%≤bY7βMπ∪4↑}}A+9KqaK
iKHA∃∨ACP@←:~(∪!'∨U(~∀∪5∨-∩%%∞b0b`b~(∪⊃%%h∪%∞HY!'∪Aεb~∀%'+¬∩%%∞d0b~∀∪5∨-∩%%∞f0b`~∀%')4%%∞h0~∀∪≥=+(~∀$A∃%'P∩\Vb4∀∪⊃%I∨∩∪%∃∞bY7¬'π∪4<@}}~(←:~∀%!'∨+P~∀∪⊃¬→)~(∪∃%'P∩\Zb4∃∪→∪A'∩t∪!%%4∪I∞bYA'∪!εD~∀∪≠=-
∪%∃∞dXZDQ%∞DR~∀∪!%%∨∩%%∞b17β'π%4↑@}|A∪YY∃OCXA%]gieUGiS←8ACh@=:~∀∪
β≠≤∪I∞dYlZc:~(∩A⊃%I∨∩∪%∃∞bY7¬'π∪4<@}}A%[a←gMSEYJ↓KmK]PACh@=:~∀∪A'∨+(4∀∪≠∨Y∩∪%∃∞bXb@b~∀∪!%%4∪I∞dYA'∪!εD~∀∪'U¬∩∪%∃∞dXb4∀∪≠∨Y∩∪%∃∞fXb@~∀∪'∃)4∪%∃∞hX~(∪≥∨+P~∀∩A)%'(∩8Vb~∀%⊃%%∨$∪%∞DY7β'
∪4↑@|}~∀←t~∀∪!M∨+(~(∪⊃β→Q~∀∪)%'(∩8Zb~∀x~∀v@ PQ==xRRR~(_v@T(U	β)∧TTT~(~∀∪→%(∩∩∩lA→∪)∃%β→&↓∂≡A⊃∃%
~∀4∃π%→_t∪¬3Q
∩Pn$bjXbHX`X`0`~∀~(v@PP!∪)&R$R~∃∪→≤A]%)&Xx4∃%π⊃	→⊗t∪	→∨π⊗b`~∃1π→%πXt∪¬→=π⊗@b4∀|~∀l@PPQy=<RR$~∀~∀l@PPQQ∨!&ZD`RRR4∃∪
≤↓]) D`Xx~(~∃∪πA¬→⊗t%'∪1¬%(∩←∪5 ↑~∀$`~∀∩D``∩∩$vA→∨
β_A'=π↔(4∀∩h`0Y	π⊃='(∩∩l@fdA	∪(A¬e)&@!∪π R0Aππα↓⊃∨'(4∀∪	πM∨↔(∩$∩vA	¬)βπ∨5!+)HA'∨π-(~∃⊃π∪¬→,t∪'∪a¬∪(∩=∪≠ ↑4∀∩`~(∩b`d$∩∩vA1∨πβ_↓'∨π↔∃(~∀∩D`XY	
⊃∨'($∩v@p↓¬∪(A	3)&0A⊃∨'P~∀∩`$∩∩vA
παA'=π↔(↓
%∨~↓∪π @,@b~∃⊃π∨¬→,t∪'∪a¬∪(∩=∪≠ ↑4∀∩`~(∩b`f$∩∩vA1∨πβ_↓'∨π↔∃(~∀∩D`XY	
⊃∨'($∩v@p↓¬∪(A	3)&0A⊃∨'P~∀∩`$∩∩vA
παA'=π↔(↓
%∨~↓∪π ~)/%↔¬1⊗t∪¬1∨π⊗∩T~∃∪π
⊃β&t$b`∩∩$vA∪≠¬∂
A≠=	
~∀%'∪1¬%(∩←∪5 ↑~∀$`XY∪
!¬+4∃∪π!	+t∪	→∨π⊗$f~∃	
π⊃β&h∩`∩∩$v@nA	∪(AβMπ∪∩A5∨	
~(∪'∪1	∪(∩←%≠ ↑~(∪	π∨	+XY⊃π∪¬+_~∀|~(v@PP!==<R$R~∀vPPQ'¬∪_RR$~∃∪
8A]'¬∪_Xx4∃π∨≥∃π∧t∪	→∨π⊗n~∃'Q)¬→⊗h∩d~∀%¬→∨π,@d~∃Q%¬→,t∩f~(∩`~∀$b~∀∩@~∀|~(v@PP!==<R$R~∀vPPQ)=!&Zb@A∨$AMβ∪_R$R~∃∪→≤A]Q b`C_]'β∪0Xx~∃⊃π∪¬+_t∪¬→=π⊗∩f4∃	π∨	+t∪	→∨π⊗$f~∀|4∀v@P Q==<$RR~∀4∀v@P Q)≥∃0RRR4∃∪
≤↓])90Xx~)→-)¬∧t∪!M∪!εb4∀∪!'%!εd~(∪!'∪Aεf~∃A'∪!εDt∪¬→=π⊗∩b4∃!'∪Aεdt∪	→∨π⊗$b~∃!M∪!εfh∪¬→∨
⊗∩b~)π⊃≥)¬∧t∪%∃!β(↓=λb`0y1 `|~∀$bXYFPSI
	REPEAT 4,<EXP 0>
	1,,ILIPSI
	REPEAT ↑D20,<EXP 0>
FLAGEF:	0

DCSOCK:	DCSOKT
ICPSOC:	0			; ICP SOCKET
DCIJFN:	0			; DC INPUT JFN
DCOJFN:	0			; DC OUTPUT JFN
>
; (((↑↑↑)))

; * VARIABLES

FLAGDD:	0

BUFFER:	BLOCK	100

	STSIZ==100
STBEG:	BLOCK	STSIZ


	END	DCSTAT
β